﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
//int main()
//{
//	while (1)
//	{
//		if (KEY_PRESS(0x30))
//		{
//			printf("0\n");
//		}
//		else if (KEY_PRESS(0x31))
//		{
//			printf("1\n");
//		}
//		else if (KEY_PRESS(0x32))
//		{
//			printf("2\n");
//		}
//		else if (KEY_PRESS(0x33))
//		{
//			printf("3\n");
//		}
//		else if (KEY_PRESS(0x34))
//		{
//			printf("4\n");
//		}
//		else if (KEY_PRESS(0x35))
//		{
//			printf("5\n");
//		}
//		else if (KEY_PRESS(0x36))
//		{
//			printf("6\n");
//		}
//		else if (KEY_PRESS(0x37))
//		{
//			printf("7\n");
//		}
//		else if (KEY_PRESS(0x38))
//		{
//			printf("8\n");
//		}
//		else if (KEY_PRESS(0x39))
//		{
//			printf("9\n");
//		}
//	}
//	return 0;
//}

//#include <locale.h>
////
//
//void GameStart(pSnake ps)
//{
//	//设置控制台窗⼝的⼤⼩，30⾏，100列 
//	//mode 为DOS命令 
//	system("mode con cols=100 lines=30");
//	//设置cmd窗⼝名称 
//	system("title 贪吃蛇");
//	//获取标准输出的句柄(⽤来标识不同设备的数值) 
//	HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//	//影藏光标操作 
//	CONSOLE_CURSOR_INFO CursorInfo;
//	GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息 
//	CursorInfo.bVisible = false; //隐藏控制台光标 
//	SetConsoleCursorInfo(hOutput, &CursorInfo);//设置控制台光标状态 
//	//打印欢迎界⾯ 
//	WelcomeToGame();
//	//打印地图 
//	CreateMap();
//	//初始化蛇 
//	InitSnake(ps);
//	//创造第⼀个⻝物 
//	CreateFood(ps);
//}

//void CreateMap()
//{
//	int i = 0;
//	//上(0,0)-(56, 0) 
//	SetPos(0, 0);
//	for (i = 0; i < 58; i += 2)
//	{
//		wprintf(L"%c", WALL);
//	}
//	//下(0,26)-(56, 26) 
//	SetPos(0, 26);
//	for (i = 0; i < 58; i += 2)
//	{
//		wprintf(L"%c", WALL);
//	}
//	//左 
//	//x是0，y从1开始增⻓ 
//	for (i = 1; i < 26; i++)
//	{
//		SetPos(0, i);
//		wprintf(L"%c", WALL);
//	}
//	//x是56，y从1开始增⻓ 
//	for (i = 1; i < 26; i++)
//	{
//		SetPos(56, i);
//		wprintf(L"%c", WALL);
//	}
//}

//void InitSnake(pSnake ps)
//{
//	pSnakeNode cur = NULL;
//	int i = 0;
//	//创建蛇⾝节点，并初始化坐标 
//	//头插法 
//	for (i = 0; i < 5; i++)
//	{
//		//创建蛇⾝的节点 
//		cur = (pSnakeNode)malloc(sizeof(SnakeNode));
//		if (cur == NULL)
//		{
//			perror("InitSnake()::malloc()");
//			return;
//		}
//		//设置坐标 
//		cur->next = NULL;
//		cur->x = POS_X + i * 2;
//		cur->y = POS_Y;
//		//头插法 
//		if (ps->_pSnake == NULL)
//		{
//			ps->_pSnake = cur;
//		}
//		else
//		{
//			cur->next = ps->_pSnake;
//			ps->_pSnake = cur;
//		}
//	}
//	//打印蛇的⾝体 
//	cur = ps->_pSnake;
//	while (cur)
//	{
//		SetPos(cur->x, cur->y);
//		wprintf(L"%lc", BODY);
//		cur = cur->next;
//	}
//	//初始化贪吃蛇数据 
//	ps->_SleepTime = 200;
//	ps->_Socre = 0;
//	ps->_Status = OK;
//	ps->_Dir = RIGHT;
//	ps->_foodWeight = 10;
//}

//void CreateFood(pSnake ps)
//{
//	int x = 0;
//	int y = 0;
//again:
//	//产⽣的x坐标应该是2的倍数，这样才可能和蛇头坐标对⻬。 
//	do
//	{
//		x = rand() % 53 + 2;
//		y = rand() % 25 + 1;
//	} while (x % 2 != 0);
//	pSnakeNode cur = ps->_pSnake;//获取指向蛇头的指针 
//	//⻝物不能和蛇⾝冲突 
//	while (cur)
//	{
//		if (cur->x == x && cur->y == y)
//		{
//			goto again;
//		}
//		cur = cur->next;
//	}
//	pSnakeNode pFood = (pSnakeNode)malloc(sizeof(SnakeNode)); //创建⻝物 
//	if (pFood == NULL)
//	{
//		perror("CreateFood::malloc()");
//		return;
//	}
//	else
//	{
//		pFood->x = x;
//		pFood->y = y;
//		SetPos(pFood->x, pFood->y);
//		wprintf(L"%c", FOOD);
//		ps->_pFood = pFood;
//	}
//}

//void SnakeMove(pSnake ps)
//{
//	//创建下⼀个节点 
//	pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode));
//	if (pNextNode == NULL)
//	{
//		perror("SnakeMove()::malloc()");
//		return;
//	}
//	//确定下⼀个节点的坐标，下⼀个节点的坐标根据，蛇头的坐标和⽅向确定 
//	switch (ps->_Dir)
//	{
//	case UP:
//	{
//		pNextNode->x = ps->_pSnake->x;
//		pNextNode->y = ps->_pSnake->y - 1;
//	}
//	break;
//	case DOWN:
//	{
//		pNextNode->x = ps->_pSnake->x;
//		pNextNode->y = ps->_pSnake->y + 1;
//	}
//	break;
//	case LEFT:
//	{
//		pNextNode->x = ps->_pSnake->x - 2;
//		pNextNode->y = ps->_pSnake->y;
//	}
//	break;
//	case RIGHT:
//	{
//		pNextNode->x = ps->_pSnake->x + 2;
//		pNextNode->y = ps->_pSnake->y;
//	}
//	break;
//	}
//	//如果下⼀个位置就是⻝物 
//	if (NextIsFood(pNextNode, ps))
//	{
//		EatFood(pNextNode, ps);
//	}
//	else//如果没有⻝物 
//	{
//		NoFood(pNextNode, ps);
//	}
//	KillByWall(ps);
//	KillBySelf(ps);
//}

////pSnakeNode psn 是下⼀个节点的地址 
////pSnake ps 维护蛇的指针 
//void NoFood(pSnakeNode psn, pSnake ps)
//{
//	//头插法 
//	psn->next = ps->_pSnake;
//	ps->_pSnake = psn;
//
//	//打印蛇 
//	pSnakeNode cur = ps->_pSnake;
//	while (cur->next->next)
//	{
//		SetPos(cur->x, cur->y);
//		wprintf(L"%c", BODY);
//		cur = cur->next;
//	}
//	//最后⼀个位置打印空格，然后释放节点 
//	SetPos(cur->next->x, cur->next->y);
//	printf(" ");
//	free(cur->next);
//	cur->next = NULL;
//}


////pSnake ps 维护蛇的指针 
//int KillByWall(pSnake ps)
//{
//	if ((ps->_pSnake->x == 0)
//		|| (ps->_pSnake->x == 56)
//		|| (ps->_pSnake->y == 0)
//		|| (ps->_pSnake->y == 26))
//	{
//		ps->_Status = KILL_BY_WALL;
//		return 1;
//	}
//	return 0;
//}

////pSnake ps 维护蛇的指针 
//int KillBySelf(pSnake ps)
//{
//	pSnakeNode cur = ps->_pSnake->next;
//	while (cur)
//	{
//		if ((ps->_pSnake->x == cur->x)
//			&& (ps->_pSnake->y == cur->y))
//		{
//			ps->_Status = KILL_BY_SELF;
//			return 1;
//		}
//		cur = cur->next;
//	}
//	return 0;
//}


void GameEnd(pSnake ps)
{
	pSnakeNode cur = ps->_pSnake;
	SetPos(24, 12);
	switch (ps->_Status)
	{
	case END_NOMAL:
		printf("您主动退出游戏\n");
		break;
	case KILL_BY_SELF:
		printf("您撞上⾃⼰了 ,游戏结束!\n");
		break;
	case KILL_BY_WALL:
		printf("您撞墙了,游戏结束!\n");
		break;
	}
	//释放蛇⾝的节点 
	while (cur)
	{
		pSnakeNode del = cur;
		cur = cur->next;
		free(del);
	}
}


